package com.sparrow.common.util;

import java.util.Base64;

public class ByteUtil {

    // 将 byte[] 编码为 hex 字符串
    public static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            //一个字节8位，16进制中每个字符4位，2个加起来正好8位 不会丢精度
            //b & 0xff 把 b 的高24位都置为0，只保留低8位，且视为正整数
            //String.format("%02x",val)格式化输出一个十六进制小写字符串
            // & 0xff 转为无符号整型，格式化成两位16进制
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }

    // 将 hex 字符串还原为 byte[]
    public static byte[] fromHexString(String hex) {
        if (hex.length() % 2 != 0) {
            throw new IllegalArgumentException("Invalid hex string length");
        }

        int len = hex.length();
        byte[] result = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            int high = Character.digit(hex.charAt(i), 16);
            int low = Character.digit(hex.charAt(i + 1), 16);
            if (high == -1 || low == -1) {
                throw new IllegalArgumentException("Invalid hex character");
            }
            result[i / 2] = (byte) ((high << 4) + low);
        }
        return result;
    }

    // 将 byte[] 编码为 Base64 字符串
    public static String toBase64(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes);
    }

    // 将 Base64 字符串解码为 byte[]
    public static byte[] fromBase64(String base64) {
        return Base64.getDecoder().decode(base64);
    }
}
